<?php

/**
 * Mailer server
 *
 * Esta clase implementa el server, debe ser ejecutada desde un cron que ejecute un script.
 * Esta seria la version sincronica, ya que manda el mail.
 *
 */
class Ext_Mailer_Sender {
    
    /**
     * Configuration to get smarty root
     *
     * @var Zend_Config
     */
    protected $_config = null;

    function __construct( $config ) {
        $this->_config = $config;
    }

    public function getConfig() {
        return $this->_config;
    }

    public function setConfig( $config ) {
        $this->_config = $config;
    }


    /**
     * Envia un mail, esta funcion esta por backward-compatibility
     *
     * Esta funcion implementa el metodo viejo para enviar mail, esta aqui por backward compatibility.
     *
     * @param mixed $from remitente o array con email del remitente y descripcion
     * @param string $to email del destinatario
     * @param string $subject titulo del mail
     * @param string $body cuerpo del mail en html.
     * @return boolean true si fue un exito el envio.
     */
    public function sendHtmlMail($from, $to, $subject, $body) {
        return $this->sendMail( $from, $to, $subject, $body, null, null, null );
    }


    /**
     * Envia un mail a partir de un template.
     *
     * Esta funcion envia un mail usando Zend_Mail, el contenido del mail se envia en un par de templates que son opcionales.
     * Un template es la version html y la otra es texto.
     *
     * @param mixed $from remitente, puede ser un array con el mail en el indice 0 y la descripcion en el indice 1
     * @param mixed $to destinatario puede ser un array con muchos destinatarios mail en el key descripcion en el value
     * @param string $subject subject del mail
     * @param mixed $templateParams array con parametros que se le pasan al template engine
     * @param string $htmlTemplate el template html para el mail
     * @param string $textTemplate el template sin html para el mail.
     * @param mixed $cc  carbon copy opcional
     * @param mixed $bcc blind carbon copy opcional
     * @return boolean true si fue un exito el envio.
     */
    public function sendTemplatedMail( $from, $to, $subject, $templateParams, $htmlTemplate = null, $textTemplate = null, $cc = null, $bcc = null ) {
        if ( ! empty( $htmlTemplate  ) ) {
            $htmlSmarty = Ext_Smarty::getInstance( $this->_config );
            foreach ( $templateParams as $k => $v ) {
                $htmlSmarty->assign( $k, $v );
            }
            $htmlBody = $htmlSmarty->fetch( $htmlTemplate );
        }
        if ( ! empty( $textTemplate  ) ) {
            $textSmarty = Ext_Smarty::getInstance( $this->_config );
            foreach ( $templateParams as $k => $v ) {
                $textSmarty->assign( $k, $v );
            }
            $textBody = $textSmarty->fetch( $textTemplate );
        }
        return $this->sendMail( $from, $to, $subject, $htmlBody, $textBody, $cc, $bcc );
    }

    /**
     * Envia un mail.
     *
     * Esta funcion envia un mail usando Zend_Mail
     *
     * @param mixed $from remitente, puede ser un array con el mail en el indice 0 y la descripcion en el indice 1
     * @param mixed $to destinatario puede ser un array con muchos destinatarios mail en el key descripcion en el value
     * @param string $subject subject del mail
     * @param string $htmlBody el body en html, se arma un multipart-mail
     * @param string $textBody el body en texto
     * @param mixed $cc  carbon copy opcional
     * @param mixed $bcc blind carbon copy opcional
     * @return boolean true si fue un exito el envio.
     */
    public function sendMail( $from, $to, $subject, $htmlBody = null, $textBody = null, $cc = null, $bcc = null )
    {
        $mail = new Zend_Mail('UTF-8');

        if( is_array( $from )) {
            $mail->setFrom( $from[0], $from[1] );
        } else {
            if ( empty( $from ) ) {
                throw new Ext_Exception("sendMail el from debe estar configurado");
            }
            $mail->setFrom( $from );
        }

        if( is_array( $to )) {
            if ( count( $to ) == 1 ) {
                $mail->addTo( $to[0] );
            } else if ( count( $to ) == 2 ) {
                $mail->addTo( $to[0], $to[1] );
            } else {
                foreach( $to as $k => $v ) {
                    $mail->addTo( $k, $v );
                }
            }
        } else {
            if ( empty( $to ) ) {
                throw new Ext_Exception("sendMail el to debe estar configurado");
            }
            $mail->addTo( $to );
        }

        if ( ! empty( $subject ) ) {
            $mail->setSubject( $subject );
        }

        if ( ! empty( $htmlBody ) ) {
            $mail->setBodyHtml($html);
        }

        if ( ! empty( $textBody ) ) {
            $mail->setBodyText( $textBody );
        }

        if ( empty( $htmlBody ) &&  empty( $textBody ) ) {
            // Empty body pa que no se queje Zend.
            $mail->setBodyText( '' );
        }

        if ( ! empty( $cc ) ) {
            if( is_array( $cc )) {
                if ( count( $cc ) == 1 ) {
                    $mail->addCc( $cc[0] );
                } else if ( count( $cc ) == 2 ) {
                    $mail->addCc( $cc[0], $cc[1] );
                } else {
                    foreach( $cc as $k => $v ) {
                        $mail->addCc( $k, $v );
                    }
                }
            } else {
                $mail->addCc( $cc );
            }
        }

        if ( ! empty( $bcc ) ) {
            if( is_array( $bcc )) {
                if ( count( $bcc ) == 1 ) {
                    $mail->addBcc( $bcc[0] );
                } else if ( count( $bcc ) == 2 ) {
                    $mail->addBcc( $bcc[0], $bcc[1] );
                } else {
                    foreach( $bcc as $k => $v ) {
                        $mail->addBcc( $k, $v );
                    }
                }
            } else {
                $mail->addCc( $bcc );
            }
        }

        try {
            $mail->send();
        } catch ( Exception $e ) {
            // Esto es por si se usa esta clase desde un webservice
            throw new Exception( $e->__toString() . " : " . $e->getMessage() );
        }
        return true;
    }
}